package org.spark.core.transformations.java;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.VoidFunction;
import org.spark.sparkUtil.SparkJavaContextUtil;

import java.util.Arrays;
import java.util.List;

/**
 * 功能概述:filter算子案例：过滤集合中的偶数
 * Datetime:    2020/5/21   11:45
 * Author:   某人的目光
 */
public class Filter {
    public static void main(String[] args) {
        JavaSparkContext sc = SparkJavaContextUtil.getSparkStart("filter");
        // 构造集合
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        // 并行化集合，创建初始RDD
        JavaRDD<Integer> numberRDD = sc.parallelize(numbers);
        // 对初始RDD执行filter算子，过滤出其中的偶数
        // filter算子，传入的也是Function，其他的使用注意点，实际上和map是一样的
        // 但是，唯一的不同，就是call()方法的返回类型是Boolean
        // 每一个初始RDD中的元素，都会传入call()方法，此时你可以执行各种自定义的计算逻辑
        // 来判断这个元素是否是你想要的
        // 如果你想在新的RDD中保留这个元素，那么就返回true；否则，不想保留这个元素，返回false
        JavaRDD<Integer> multipleNumberRDD = numberRDD.filter(new Function<Integer, Boolean>() {
            // 在这里，1到10，都会传入进来
            // 但是根据我们的逻辑，只有2,4,6,8,10这几个偶数，会返回true
            // 所以，只有偶数会保留下来，放在新的RDD中
            public Boolean call(Integer value) throws Exception {
                return value % 2 == 0;
            }
        });
        // 打印新的RDD
        multipleNumberRDD.foreach(new VoidFunction<Integer>() {
            public void call(Integer t) throws Exception {
                System.out.println(t);
            }
        });

    }
}
